package medium

/*
时间复杂度:O(N)
空间复杂度:O(C)

固定窗口

解:设置窗口大小为k, 先通过hash求出初始窗口的字符种类,如果为k则表示所有字符均只出现一次,则ans++
滑动窗口,hash右边的字符+1,左边的字符-1, 如果左边字符减为0则从hash中删除该字符
*/

func numKLenSubstrNoRepeats(s string, k int) int {
	hash := make(map[byte]int)
	ans := 0
	if len(s) < k {
		return 0
	}
	for i := 0; i < k; i++ {
		hash[s[i]]++
	}
	if len(hash) == k {
		ans++
	}

	for i := k; i < len(s); i++ {
		hash[s[i]]++
		hash[s[i-k]]--
		if hash[s[i-k]] == 0 {
			delete(hash, s[i-k])
		}
		if len(hash) == k {
			ans++
		}
	}
	return ans
}